import Taro from "@tarojs/taro";
// ajax封装 wx.request

/**
 * 1. 封装 请求request
 *   为什么要封装？
 *   封装成什么形式？
 *   这个形式有什么好处？
 *   封装成这个形式之后，调用？
 *   演示效果
 *
 * 2. 为了后期调试bug方便，引入了手机信息收集机制
 *    wx.getSystemInfoSync();
 *    前后端交互模式，携带在请求头中
 *    演示效果 （get / post）
 *
 * 3. 拓展：
 *
 *    异步解决方案上来说：五种解决方案
 *    promise 优缺点。
 *    调用时候，asyc + await方式
 *
 * 4. event loop
 *
 *
 *
 *
 *
 */

let system = Taro.getSystemInfoSync();
console.log("system:", system);
// 手机信息 // 调试bug 微信版本 os 小程序
const clientInfo = {
  clientType: "mp",
  appnm: "1811A-pay", // name
  model: system.model, //
  os: system.system, // 系统
  screen: system.screenWidth + "*" + system.screenHeight, // 屏幕信息
  // version: App.version || "1.0.1", // 版本
  channel: "1811A-mp", //
};

// 环境 变量的判断，
// 1. 开发环境：localhost
// 2. 线上服务器环境：http://47.101.45.245:3000
const NODE_ENV = {
  mockApi: "http://localhost:3000",
  baseApi: "http://47.101.45.245:3000",
};

// console.log('clientInfo:', clientInfo)
const errMsg = "服务异常，请稍后重试";
export const fetch = (url, data = {}, option = {}) => {
  let {
    loading = true,
    toast = true,
    isMock = true,
    method = "get",
  }: any = option;
  return new Promise((resolve, reject) => {
    if (loading) {
      Taro.showLoading({
        title: "加载中...",
        mask: true,
      });
    }

    let env = isMock ? NODE_ENV.mockApi : NODE_ENV.baseApi;
    // env: http:localhost:3000
    // baseURL: http:localhost:3000/api/detail
    //wx.request封装模式落后，--》异步第一代解决方案：回调：回调地狱，维护性差，
    // new Promise
    Taro.request({
      url: env + url,
      data,
      method,
      header: {
        clientInfo: JSON.stringify(clientInfo),
      },
      success: function (result) {
        console.log("result:", result);
        let res = result.data; // {code:0,data:'',message:''}
        if (res.code == 0) {
          if (loading) {
            Taro.hideLoading();
          }
          console.log("res:", res);
          resolve(res.data);
        } else {
          if (toast) {
            Taro.showToast({
              mask: true,
              title: res.messsage,
              icon: "none",
            });
          } else {
            Taro.hideLoading();
          }
          reject(res);
        }
      },
      fail: function (e: any = { code: -1, msg: errMsg, errMsg }) {
        let msg = e.errMsg;
        if (msg == "request:fail timeout") {
          msg = "服务请求超时，请稍后处理";
        }
        Taro.showToast({
          title: msg,
          icon: "none",
        });
        reject(e);
      },
    });
  });
};
